
import http from './HTTP';
import MathUtils from '../math_utils';
import GameConfig from './gameconfig';
import Utils from '../utils';
import ArrayUtils from '../array_utils';

/**
 * 不同平台的操作,都继承此类.
 *
 */
class BaseClient {

    /**
     * @constructor
     */
    constructor(config){ // eslint-disable-line
        this._opId = 0;

        // 记录一个 videoFlagFrame 和 shareFlagFrame
        this._videoFlagFrame = null;
        this._shareFlagFrame = null;
    }

    setDefaultFlagFrame(videoFrame,shareFrame){
        this._videoFlagFrame = videoFrame;
        this._shareFlagFrame = shareFrame;
    }

    //------------------------------------
    // override && apis
    /**
     * 相应的平台初始化. 进行一些设置,如：showShareMenu,onMemoryWarning
     * 每个平台都应该重写改方法
     */
    init(){}

    /**
     * 当数据存储在服务端时,需要去请求数据
     * @param cb {Function}
     */
    login(cb){
        this._defaultLogin(cb);
    }


    checkServerData(){
        if(ShSdk.isWebTest()){
            this._defaultLogin((ret)=>{
                if(!ret.data){
                    throw new Error('Wxapi.Login 登陆返回的数据错误!');
                }

                let gameData = ShSdk.GameData;

                // 检查ID
                if (gameData.localData.userid !== ret.data.userid) {
                    gameData.localData.userid = ret.data.userid;
                    gameData.saveData(3);
                }

                if(ret.data && ret.data.maxscore === 1){
                    // web  for test
                    console.log('发现数据更新');
                    if(ret.data.serverjson && ret.data.serverjson){
                        let serverJsonObj = JSON.parse(ret.data.serverjson);
                        let newDataStr = JSON.stringify(serverJsonObj.newData);
                        gameData.localData.userjson = newDataStr;
                        gameData._dumpLocalData();
                        gameData.saveData(2);
                        gameData.UploadSyncFlag();
                        console.log('serverJsonObj:',newDataStr);
                        console.log('数据更新完毕!');
                    }
                }
            });
        }
    }

    /**
     * 登陆/获取数据失败回调
     * 微信抖音下可以重写,进行弹框提示.
     * @param ret
     */
    onLoginError(ret){
        // 默认处理 直接抛出错误
        throw new Error(`登陆出错,info:${ret}`);
    }

    /**
     * 将数据(如:排行榜得分)保存到相关平台
     * @param data {object}
     */
    saveToPlatform(data){ // eslint-disable-line
        console.log('===== 没有将数据保存到相应平台=============');
    }


    /**
     * 默认登陆方式. 本地生成一个key去标识用户
     * @param cb {Function}
     */
    _defaultLogin(cb){
        // 简单处理几个平台
        // 可以被 override
        // 检查本地是否有 account
        let user_account = cc.sys.localStorage.getItem('user_account');
        if(!user_account){
            let platformCode = cc.sys.platform;
            let stamp = Date.now();
            let arr = ArrayUtils.shuffle('abcdefghijklmnopqrstuvwxyz'.split(''));
            let randomLen = MathUtils.random(5,10);
            let randomName = arr.slice(0,randomLen).join('');
            user_account = `${platformCode}_${randomName}_${stamp}`;

            // 存起来
            cc.sys.localStorage.setItem('user_account',user_account);
        }
        let data = {account:user_account};

        http.Get('login',data,(ret)=>{
            cb(ret);
        });
    }


    /**
     * 获取当前的操作,应该是分享还是视频
     * @return {number} ShSdk.OP_PLAY_VIDEO | ShSdk.OP_SHARE
     */
    getOpValue(){
        let cfg = GameConfig.getServerCfg().toggleCfg;
        if (!cfg) {
            cfg = [1]; // 1 表示视频  2表示分享
        }
        let len = cfg.length;
        let idx = this._opId % len;
        return cfg[idx];
    }

    /**
     * 自增 opId
     */
    _increaseOpId(){
        this._opId++;
    }

    /**
     *
     * obj:{
             sp: {cc.Sprite},
             videoFrame: {cc.SpriteFrame},
             shareFrame:{cc.SpriteFrame},
             defaultOpValue:{undefined | number}
         }
     * @param obj
     * @return {number} ShSdk.OP_PLAY_VIDEO | ShSdk.OP_SHARE
     */
    initOpValue(obj){
        let sp_flag = obj.sp;
        let videoFrame = obj.videoFrame || this._videoFlagFrame;
        let shareFrame = obj.shareFrame || this._shareFlagFrame;
        let defaultOpValue = obj.defaultValue;

        Utils.asset(sp_flag,'sp_flag 必须为空!');
        Utils.asset(sp_flag instanceof cc.Sprite,'sp_flag必须为cc.Sprite及其子类');

        if(!defaultOpValue){
            let opValue = this.getOpValue();
            if(opValue === ShSdk.OP_PLAY_VIDEO){
                sp_flag.spriteFrame = videoFrame;
            }else if(opValue === ShSdk.OP_SHARE){
                sp_flag.spriteFrame = shareFrame;
            }else{
                console.warn(`error opValue:${opValue}`);
            }
            return opValue;
        }else{
            if(defaultOpValue === ShSdk.OP_PLAY_VIDEO){
                sp_flag.spriteFrame = videoFrame;
            }else if(defaultOpValue === ShSdk.OP_SHARE){
                sp_flag.spriteFrame = shareFrame;
            }else{
                console.warn(`error defaultValue:${defaultOpValue}`);
            }
            return defaultOpValue;
        }
    }

    /**
     * obj:{
     *     key:{string}, 分享的key
     *     success:{Function} , 操作成功的回调,可能是视频可能是分享
     *     auto:{boolean} 默认为true. 当没有缓存视频时自动分享
     * }
     * @param opValue {number} ShSdk.OP_PLAY_VIDEO | ShSdk.OP_SHARE
     * @param obj {object}
     */
    playVideoOrShare(opValue,obj){
        if(window.ShSdk.isWebTest()){
            this._increaseOpId();
            if(opValue === ShSdk.OP_PLAY_VIDEO){
                console.log('------------测试播放video-----------');
            }else if(opValue === ShSdk.OP_SHARE){
                console.log('------------测试分享-----------');
            }else{
                console.warn(`error opValue:${opValue}`);
            }

            // 10ms后 操作成功
            setTimeout(()=>{
                if(obj.success){
                    console.log('------playVideoOrShare 成功!-------');
                    obj.success();
                }
            },20);
        }
    }

    //-----------------
    // ad相关
    /**
     */
    cacheVideo(){
        console.log('-----------cacheVideo called-----------------');
    }

    showBannerAd(){
        console.log('-----------showBannerAd called-----------------');
    }
    hideBannerAd(){
        console.log('-----------hideBannerAd called-----------------');
    }
    showInterAd(){
        console.log('-----------showInterAd called-----------------');
    }


    /**
     * true: 表示当前是显示状态. 为true 并不一定表示真的就显示出来了.
     * false：表示当前应该是 关闭状态
     */
    getBannerState(){
        // TODO: 各个平台等待实现
    }

    showNativeAd(){
        console.log('-----------showNativeAd called-----------------');
    }
    hideNativeAd(){
        console.log('-----------hideNativeAd called-----------------');
    }
}

export default BaseClient;
